/* Copyright (C) 2010  Romolo Camplani, Marco Fortunato, Marco Marelli, Guido Rota, Fabio A. Schreiber et al.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

package org.dei.perla.sys.hlqexecutor;

import javax.xml.datatype.Duration;

public class Query {
	
	private boolean timeBased = false;
	private boolean eventBased = false;
	private Duration duration = null;
	private int sample = 0;
	private String nameTableEvent = null;
	private String nameView = null;
	private String createView = "CREATE VIEW " + nameView + "AS ";
	private String sql = "";
	private String sqlSelect = "SELECT ";
	private String sqlFrom = "FROM ";
	private String sqlWhere = "WHERE ";
	private String sqlGroupBy = "GROUP BY ";
	private String sqlHaving = "HAVING ";
	
	
	public Query() {
		
	}
	
	public void setNameView(String nameView) {
		this.nameView = nameView;
	}
	
	public void setSelect(String s) {
		
	}
	
	public void setFrom(String s) {
		
	}
	
	public void setWhere(String s) {
		
	}
	
	public void setGroupBy(String s) {
		
	}
	
	public void setHaving(String s) {
		
	}
	
	public String getQuerySQL() throws QueryException{
		
		//la creazione di una vista è opzionale e puo servire come struttura d'appoggio   
		if(nameView != null)
			sql += createView;
		
		//clausola necessaria per una query
		if(sqlSelect == "SELECT ") throw new QueryException("Query not valid! Set SELECT field list.");
		else sql += sqlSelect; 
		
		//clausola necessaria per una query
		if(sqlFrom == "FROM ") throw new QueryException("Query not valid! Set FROM field list.");
		else sql += sqlFrom;
		
		//clausola opzionale per una query
		if(sqlWhere != "WHERE ")sql += sqlWhere;
		
		//clausola opzionale per una query
		if(sqlSelect != "GROUP BY ")
			if(sqlHaving != "HAVING ")sql += sqlGroupBy + sqlHaving;
			else sql += sqlGroupBy;
		return sql;
	}
	
	/**
	 * Permette di sapere se si tratta di una query event based
	 * @return un valore boolean
	 */
	public boolean isEventBased() {
		return this.eventBased;
	}
	
	/**
	 * Permette di sapere se si tratta di una query time based
	 * @return un valore boolean
	 */
	public boolean isTimeBased() {
		return this.timeBased;
	}

	/**
	 * Setta la durata della query se si tratta di una query time based.
	 * @param duration un oggetto Duration rappresentante la durata della query.
	 */
	public void setDuration(Duration duration) {
		this.duration = duration;
		this.timeBased = true;
	}

	/**
	 * Restituisce la durata della query se si tratta di una query time based
	 * altrimenti restituisce null.
	 * @return un oggetto Duration
	 */
	public Duration getDuration() {
		return duration;
	}

	/**
	 * Setta la durata della query se si tratta di una query event based.
	 * @param sample un int rappresentante il numero di campioni, ovviamente
	 * deve essere un intero maggiore di 0.
	 */
	public void setSample(int sample) {
		if (sample > 0) {
			this.sample = sample;
			this.eventBased = true;
		}
			
	}

	/**
	 * Restituisce il numero di campioni per che fanno scattare l'evento della query 
	 * se si tratta di una query event based altrimenti restituisce 0.
	 * @return the sample
	 */
	public int getSample() {
		return sample;
	}

	/**
	 * Setta il nome della tabella (o vista ) su cui impostare un trigger per monitorare 
	 * l'evento.
	 * @param nameTableEvent un oggetto String rappresentante il nome della tabella
	 */
	public void setNameTableEvent(String nameTableEvent) {
		this.nameTableEvent = nameTableEvent;
	}

	/**
	 * Restituisce il nome della tabella da monitorare in attesa che si verifichi l'evento.
	 * Restituisce null se non si tratta di una query event based.
	 * @return the nameTableEvent
	 */
	public String getNameTableEvent() {
		return nameTableEvent;
	}

	/**
	 * Crea una copia esatta dell'oggetto
	 */
	public Query clone() {
		Query tmp = new Query();
		// TODO bisogna settare tutti i valori per creare la copia
		return tmp;
	}
	
	public boolean equals(Query query) {
		//TODO da implementare
		return true;
	}
	
}
